// 题目描述：
// 给你一个整数数组 citations ，其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。

// 根据维基百科上 h 指数的定义：h 代表“高引用次数” ，一名科研人员的 h 指数 是指他（她）至少发表了 h 篇论文，并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值，h 指数 是其中最大的那个。



// 示例 1：

// 输入：citations = [3,0,6,1,5]
// 输出：3 
// 解释：给定数组表示研究者总共有 5 篇论文，每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
//      由于研究者有 3 篇论文每篇 至少 被引用了 3 次，其余两篇论文每篇被引用 不多于 3 次，所以她的 h 指数是 3。
// 示例 2：

// 输入：citations = [1,3,1]
// 输出：1

// 自己的答案(答案错误，没解出来，没看懂题意，原以为是数组中 >= citations[i] 的个数和 citations[i] 相等，但实际上题目是要计算 citations[i] >= i + 1， 并取 i + 1（表示他发表的第几篇论文） 的最大值 )：
/**
 * @param {number[]} citations
 * @return {number}
 */
var hIndex = function(citations) {
    if(citations.every(e => e === 0)) {
        return 0
    }
    let count = 0;
    for (let i = 0; i < citations.length; i++) {
        const citiation = citations[i];
        const citiationLength = citations.filter(e => e >= citiation).length
        if(citiation === citiationLength && citiation > count) {
          count = citiation
        }
    }
    return count
};

// Gpt答案：
function hIndex(citations) {
    // 对数组进行降序排序
    citations.sort((a, b) => b - a);
 
    let h = 0;
    for (let i = 0; i < citations.length; i++) {
        // 如果当前论文的引用次数大于等于当前的 h 值，则 h 值有效
        if (citations[i] >= i + 1) {
            h = i + 1;
        } else {
            // 一旦当前论文的引用次数小于当前的 h 值，则不再可能有更大的 h 值
            break;
        }
    }
 
    return h;
}

// 官方题解：
var hIndex = function (citations) {
    citations.sort((a, b) => a - b); // 从大到小
    let h = 0,
        i = citations.length - 1;
    while (i >= 0 && citations[i] > h) {
        h++;
        i--;
    }
    return h;
};

// 新人暴力破解法（官方）

/**
 * @param {number[]} citations
 * @return {number}
 */
var hIndex = function (arr) {
    if (arr.length == 1 && arr[0] == 0) return 0;

    let indexArr = [];
    for (let i = 0; i < arr.length; i++) {
        indexArr.push(i);
    }

    for (let i = 1; i < indexArr.length + 1; i++) {
        let fArr = arr.filter(item => {
            if (item == 0) {
                return false;
            }

            return item >= i;
        });

        if (fArr.length == i) {
            return i;
        }
        if (fArr.length < i) { // 没懂
            return i - 1;
        }
    }
};